package top.mccsdl.Acbot.config;

import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import top.mccsdl.Acbot.eventListener.EventListener;

import java.util.HashMap;
import java.util.Map;

@Configuration
@Slf4j
@Component
public class ListenerConfig {

    private final Map<String, EventListener> eventListeners = new HashMap<>();
    // 用于存储消息及其最后处理时间的映射
    private final Map<String, Long> eventTimestamps = new HashMap<>();
    // 防抖时间间隔，单位为毫秒
    private static final long DEBOUNCE_INTERVAL = 10 * 1000;
    @Autowired
    private ApplicationContext applicationContext;

    @PostConstruct
    private void registerListeners() {
        // 获取所有实现 EventListener 接口且带有 EventName 注解的 Bean
        String[] beanNames = applicationContext.getBeanNamesForType(EventListener.class);
        for (String beanName : beanNames) {
            EventListener listener = applicationContext.getBean(beanName, EventListener.class);
            Class<?> listenerClass = listener.getClass();
            if (listenerClass.isAnnotationPresent(EventName.class)) {
                EventName eventName = listenerClass.getAnnotation(EventName.class);
                String eventNameValue = eventName.value();
                log.info("发现事件-->{}", eventNameValue);
                eventListeners.put(eventNameValue, listener);
            }
        }
    }

    /**
     * 事件分发
     *
     * @param eventName 事件名
     * @param eventData 事件内容
     */
//    public void dispatchEvent(String eventName, JSONObject eventData) {
//        EventListener listener = eventListeners.get(eventName);
//        if (listener != null) {
//            listener.onEvent(eventData);
//        } else {
//            log.warn("未找到事件监听器：" + eventName);
//        }
//    }
    /**
     * 事件分发
     *
     * @param eventName 事件名
     * @param eventData 事件内容
     */
    public void dispatchEvent(String eventName, JSONObject eventData) {
        long currentTime = System.currentTimeMillis();
        // 生成唯一标识，由事件名和JSON内容的字符串表示组成
        String uniqueKey = eventName + eventData.toJSONString();

        // 检查事件是否在防抖时间间隔内已经被处理过
        if (eventTimestamps.containsKey(uniqueKey)) {
            long lastProcessedTime = eventTimestamps.get(uniqueKey);
            if (currentTime - lastProcessedTime < DEBOUNCE_INTERVAL) {
                // 如果在防抖时间间隔内，不处理该事件
                log.warn("事件 [" + uniqueKey + "] 在防抖时间内，忽略此次分发。");
                return;
            }
        }
        // 更新事件的最后处理时间
        eventTimestamps.put(uniqueKey, currentTime);

        EventListener listener = eventListeners.get(eventName);
        if (listener != null) {
            listener.onEvent(eventData);
        } else {
            log.warn("未找到事件监听器：" + eventName);
        }
    }
}
